WebAssembly์ ์ฐธ์กฐ ์ํ ๊ฐ์ง ๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ํ ์ฌ์ธต ๋ถ์์ผ๋ก, ๋ค์ํ ํ๋ซํผ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ธฐ์ ์ ํ๊ตฌํฉ๋๋ค.
WebAssembly GC: ์ฐธ์กฐ ์ํ ํธ๋ค๋ง ๋ง์คํฐํ๊ธฐ
WebAssembly (Wasm)๋ ์ฝ๋์ ๊ณ ์ฑ๋ฅ, ์ด์์ฑ, ๋ณด์์ฑ์ ๊ฐ์ถ ์คํ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ ์น ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ์ต๊ทผ Wasm์ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ด ์ถ๊ฐ๋๋ฉด์ ๊ฐ๋ฐ์๋ค์ C#, Java, Kotlin๊ณผ ๊ฐ์ ์ธ์ด๋ฅผ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ค๋ฒํค๋ ์์ด ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์ฌ์ฉํ ์ ์๋ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ด ์ด๋ ธ์ต๋๋ค. ํ์ง๋ง GC๋ ํนํ ์ฐธ์กฐ ์ํ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด ์๋ก์ด ๊ณผ์ ๋ฅผ ์ ์ํฉ๋๋ค. ์ด ๊ธ์ WebAssembly GC์์ ์ฐธ์กฐ ์ํ์ ์ดํดํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ์ฌ, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์ด ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฐธ์กฐ ์ํ์ด๋ ๋ฌด์์ธ๊ฐ?
์ฐธ์กฐ ์ํ(์ํ ์ฐธ์กฐ๋ผ๊ณ ๋ ํจ)์ ๋ ๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ์ฌ ๋ซํ ๋ฃจํ๋ฅผ ํ์ฑํ ๋ ๋ฐ์ํฉ๋๋ค. ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ์์คํ ์์ ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ๋ฃจํธ ์งํฉ(์ ์ญ ๋ณ์, ์คํ)์์ ๋ ์ด์ ๋๋ฌํ ์ ์๊ฒ ๋๋ฉด, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ด๋ฅผ ํ์ํ์ง ๋ชปํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ GC ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฒด ์ํ์ด ์ฌ์ค์ ๊ณ ๋ฆฝ๋์์์๋ ๋ถ๊ตฌํ๊ณ ์ํ ๋ด ๊ฐ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ์ฐธ์กฐ๋๊ณ ์๋ค๊ณ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ์์ Wasm GC ์ธ์ด(Java๋ C#๊ณผ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ฐ๋ ์ ์ผ๋ก ์ ์ฌ)์์์ ๊ฐ๋จํ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
class Person {
String name;
Person friend;
}
Person alice = new Person("Alice");
Person bob = new Person("Bob");
alice.friend = bob;
bob.friend = alice;
// ์ด ์์ ์์ Alice์ Bob์ ์๋ก๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
alice = null;
bob = null;
// Alice์ Bob ๋ชจ๋ ์ง์ ์ ๊ทผํ ์ ์์ง๋ง, ์ฌ์ ํ ์๋ก๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
// ์ด๊ฒ์ด ์ฐธ์กฐ ์ํ์ด๋ฉฐ, ๋จ์ํ GC๋ ์ด๋ค์ ์์งํ์ง ๋ชปํ ์ ์์ต๋๋ค.
์ด ์๋๋ฆฌ์ค์์๋ `alice`์ `bob`์ด `null`๋ก ์ค์ ๋์์์๋ ๋ถ๊ตฌํ๊ณ , ๊ทธ๋ค์ด ๊ฐ๋ฆฌํค๋ `Person` ๊ฐ์ฒด๋ค์ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ์ ์ ํ ์ฒ๋ฆฌ ์์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ผ๋ฉฐ, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
WebAssembly GC์์ ์ฐธ์กฐ ์ํ์ด ๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
์ฐธ์กฐ ์ํ์ ์ฌ๋ฌ ์์ธ์ผ๋ก ์ธํด WebAssembly GC์์ ํนํ ๊ตํํ๊ฒ ์์ฉํ ์ ์์ต๋๋ค:
- ์ ํ๋ ๋ฆฌ์์ค: WebAssembly๋ ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ ๋๋ ์์คํ ๊ณผ ๊ฐ์ด ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์์ ์คํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋น ๋ฅด๊ฒ ์ฑ๋ฅ ์ ํ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์ : ์น ์ ํ๋ฆฌ์ผ์ด์ , ํนํ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ ์ฅ๊ธฐ๊ฐ ์คํ๋ ์ ์์ต๋๋ค. ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ผ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋์ ๋์ด ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ์ํธ ์ด์ฉ์ฑ: WebAssembly๋ ์ข ์ข ์์ฒด ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง JavaScript ์ฝ๋์ ์ํธ ์์ฉํฉ๋๋ค. ์ด ๋ ์์คํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, ์ฐธ์กฐ ์ํ์ ์ด๋ฅผ ๋์ฑ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
- ๋๋ฒ๊น ์ ๋ณต์ก์ฑ: ์ฐธ์กฐ ์ํ์ ์๋ณํ๊ณ ๋๋ฒ๊น ํ๋ ๊ฒ์ ํนํ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ ํต์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ Wasm ํ๊ฒฝ์์ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฑฐ๋ ํจ๊ณผ์ ์ด์ง ์์ ์ ์์ต๋๋ค.
WebAssembly GC์์ ์ฐธ์กฐ ์ํ์ ์ฒ๋ฆฌํ๋ ์ ๋ต
๋คํํ๋, WebAssembly GC ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐธ์กฐ ์ํ์ ๋ฐฉ์งํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ๋ต์ด ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
1. ์ ์ด์ ์ํ์ ๋ง๋ค์ง ์๊ธฐ
์ฐธ์กฐ ์ํ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ด์ ๋ง๋ค์ง ์๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ ์คํ ์ค๊ณ์ ์ฝ๋ฉ ๊ดํ์ด ํ์ํฉ๋๋ค. ๋ค์ ์ง์นจ์ ๊ณ ๋ คํ์ญ์์ค:
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ฒํ : ์ํ ์ฐธ์กฐ์ ์ ์ฌ์ ์์ธ์ ์๋ณํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ์ญ์์ค. ์ํ์ ํผํ๋๋ก ์ฌ์ค๊ณํ ์ ์์ต๋๊น?
- ์์ ๊ถ ์๋ฏธ๋ก : ๊ฐ์ฒด์ ๋ํ ์์ ๊ถ ์๋ฏธ๋ก ์ ๋ช ํํ ์ ์ํ์ญ์์ค. ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ฑ ์์ด ์์ต๋๊น? ๊ฐ์ฒด๋ค์ด ๋๋ฑํ ์์ ๊ถ์ ๊ฐ์ง๊ณ ์๋ก๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์ ํผํ์ญ์์ค.
- ๊ฐ๋ณ ์ํ ์ต์ํ: ๊ฐ์ฒด์ ๊ฐ๋ณ ์ํ ์์ ์ค์ด์ญ์์ค. ๋ถ๋ณ ๊ฐ์ฒด๋ ์์ฑ ํ ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ์ ๋ง๋ค ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฐฉํฅ ๊ด๊ณ ๋์ ์ ์ ํ ๊ฒฝ์ฐ ๋จ๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฐฉํฅ์ผ๋ก ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ง์ ์ ์ธ ๊ฐ์ฒด ์ฐธ์กฐ ๋์ ๋ณ๋์ ์ธ๋ฑ์ค๋ ์กฐํ ํ ์ด๋ธ์ ์ ์งํ์ญ์์ค.
2. ์ฝํ ์ฐธ์กฐ(Weak References)
์ฝํ ์ฐธ์กฐ๋ ์ฐธ์กฐ ์ํ์ ๋๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ฝํ ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ณณ์์ ๋๋ฌํ ์ ์๊ฒ ๋์์ ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ง์ง ์๋ ์ฐธ์กฐ์ ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ฉด ์ฝํ ์ฐธ์กฐ๋ ์๋์ผ๋ก ์ง์์ง๋๋ค.
๋๋ถ๋ถ์ ํ๋ ์ธ์ด๋ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Java์์๋ `java.lang.ref.WeakReference` ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก C#์ `System.WeakReference` ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. WebAssembly GC๋ฅผ ๋์์ผ๋ก ํ๋ ์ธ์ด๋ค๋ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ฝํ ์ฐธ์กฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด, ๊ด๊ณ์์ ๋ ์ค์ํ ์ชฝ์ ์๋ณํ๊ณ ํด๋น ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ๋ ์ค์ํ ๊ฐ์ฒด๋ฅผ ํ์ํ์ฌ ์ํ์ ๋์ ์ ์์ต๋๋ค.
์ด์ ์ `Person` ์์ ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ์น๊ตฌ๊ฐ ๋๊ตฌ์ ์น๊ตฌ์ธ์ง ์๋ ๊ฒ๋ณด๋ค ํ ์ฌ๋์ ์น๊ตฌ๋ค์ ์ถ์ ํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๋ฉด, `Person` ํด๋์ค์์ ์น๊ตฌ๋ฅผ ๋ํ๋ด๋ `Person` ๊ฐ์ฒด๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
class Person {
String name;
WeakReference<Person> friend;
}
Person alice = new Person("Alice");
Person bob = new Person("Bob");
alice.friend = new WeakReference<Person>(bob);
bob.friend = new WeakReference<Person>(alice);
// ์ด ์์ ์์ Alice์ Bob์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํตํด ์๋ก๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
alice = null;
bob = null;
// Alice์ Bob ๋ชจ๋ ์ง์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ฝํ ์ฐธ์กฐ๋ ์ด๋ค์ด ์์ง๋๋ ๊ฒ์ ๋ง์ง ์์ต๋๋ค.
// ์ด์ GC๋ Alice์ Bob์ด ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ ์ญ์ ๋งฅ๋ฝ์์์ ์์: WebAssembly๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋ ์์ ๋คํธ์ํน ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ญ์์ค. ๊ฐ ์ฌ์ฉ์ ํ๋กํ์ ํ๋ก์ ๋ชฉ๋ก์ ์ ์ฅํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ค์ด ์๋ก ํ๋ก์ฐํ ๊ฒฝ์ฐ ์ฐธ์กฐ ์ํ์ ํผํ๊ธฐ ์ํด ํ๋ก์ ๋ชฉ๋ก์ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์์ ํ๋กํ์ด ๋ ์ด์ ํ๋ฐํ๊ฒ ๋ณด๊ฑฐ๋ ์ฐธ์กฐ๋์ง ์์ ๋, ๋ค๋ฅธ ์ฌ์ฉ์๋ค์ด ์ฌ์ ํ ๊ทธ๋ฅผ ํ๋ก์ฐํ๊ณ ์๋๋ผ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ด๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
3. Finalization Registry
Finalization Registry๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๊ธฐ ์ง์ ์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ์ด๋๋ผ์ด์ ์์ ๋ช ์์ ์ผ๋ก ์ฐธ์กฐ๋ฅผ ์ง์์ผ๋ก์จ ์ฐธ์กฐ ์ํ์ ๋๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ์ธ์ด์ ์๋ฉธ์๋ ํ์ด๋๋ผ์ด์ ์ ์ ์ฌํ์ง๋ง, ์ฝ๋ฐฑ์ ๋ช ์์ ์ผ๋ก ๋ฑ๋กํด์ผ ํฉ๋๋ค.
Finalization Registry๋ ๋ฆฌ์์ค ํด์ ๋ ์ฐธ์กฐ ์ํ ๋๊ธฐ์ ๊ฐ์ ์ ๋ฆฌ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด๋๋ผ์ด์ ์ด์ ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ์ ์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๊ณ ๋น๊ฒฐ์ ์ ์ธ ๋์์ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํนํ, ์ํ์ ๋๋ *์ ์ผํ* ๋ฉ์ปค๋์ฆ์ผ๋ก ํ์ด๋๋ผ์ด์ ์ด์ ์ ์์กดํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํ์๊ฐ ์ง์ฐ๋๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ ํ์ด๋๋ผ์ด์ ์ด์ ์ ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์:
// ๊ฐ์์ WASM GC ์ปจํ
์คํธ๋ฅผ ๊ฐ์ ํฉ๋๋ค
let registry = new FinalizationRegistry(heldValue => {
console.log("Object about to be garbage collected", heldValue);
// heldValue๋ ์ฐธ์กฐ ์ํ์ ๋๋ ์ฝ๋ฐฑ์ผ ์ ์์ต๋๋ค.
heldValue();
});
let obj1 = {};
let obj2 = {};
obj1.ref = obj2;
obj2.ref = obj1;
// ์ํ์ ๋๊ธฐ ์ํ ์ ๋ฆฌ ํจ์ ์ ์
function cleanup() {
obj1.ref = null;
obj2.ref = null;
console.log("Reference cycle broken");
}
registry.register(obj1, cleanup);
obj1 = null;
obj2 = null;
// ์ ์ ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์คํ๋ ๋, obj1์ด ์์ง๋๊ธฐ ์ ์ cleanup()์ด ํธ์ถ๋ฉ๋๋ค.
4. ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (๋งค์ฐ ์ ์คํ๊ฒ ์ฌ์ฉ)
Wasm GC์ ๋ชฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ ๊ฒ์ด์ง๋ง, ๋งค์ฐ ํน์ ํ ์๋๋ฆฌ์ค์์๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก Wasm์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ช ์์ ์ผ๋ก ํ ๋น ๋ฐ ํด์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋งค์ฐ ์ฌ์ฐ๋ฏ๋ก ๋ค๋ฅธ ๋ชจ๋ ์ต์ ์ ์์งํ์ ๋ ์ตํ์ ์๋จ์ผ๋ก๋ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ๋ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๋์, ๋๊ธ๋ง ํฌ์ธํฐ ๋ฐ ๊ธฐํ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๊ธฐ ์ํด ๊ทน๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฃจํด์ ์ฌ์ฉํ๊ณ ์ฝ๋๋ฅผ ์๊ฒฉํ๊ฒ ํ ์คํธํ์ญ์์ค.
์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ ์๋ ๋ค์ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค (๊ทธ๋ฌ๋ ์ฌ์ ํ ์ ์คํ๊ฒ ํ๊ฐํด์ผ ํฉ๋๋ค):
- ๊ณ ์ฑ๋ฅ์ด ์ค์ํ ์น์ : ์ฝ๋ ์น์ ์ด ๊ทน๋๋ก ์ฑ๋ฅ์ ๋ฏผ๊ฐํ๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ค๋ฒํค๋๊ฐ ์ฉ๋ฉ๋ ์ ์๋ ๊ฒฝ์ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ ํฅ์์ด ์ถ๊ฐ๋ ๋ณต์ก์ฑ๊ณผ ์ํ์ ์์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ์คํ๊ฒ ํ๋กํ์ผ๋งํด์ผ ํฉ๋๋ค.
- ๊ธฐ์กด C/C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํธ ์์ฉ: ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด C/C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉํ๋ ๊ฒฝ์ฐ, ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Wasm ์ฝ๋์์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
์ค์ ์ฐธ๊ณ : GC ํ๊ฒฝ์์์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์๋นํ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ GC๋ฅผ ํ์ฉํ๊ณ ์ํ ๋๊ธฐ ๊ธฐ์ ์ ๋จผ์ ์ง์คํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
5. ๊ฐ๋น์ง ์ปฌ๋ ์ ํํธ
์ผ๋ถ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋์์ ์ํฅ์ ์ค ์ ์๋ ํํธ๋ ์ง์๋ฌธ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํํธ๋ GC๊ฐ ํน์ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ ์ ๊ทน์ ์ผ๋ก ์์งํ๋๋ก ์ ๋ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ํํธ์ ๊ฐ์ฉ์ฑ๊ณผ ํจ๊ณผ๋ ํน์ GC ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ผ๋ถ GC๋ ๊ฐ์ฒด์ ์์ ์๋ช ์ ์ง์ ํ ์ ์๋๋ก ํฉ๋๋ค. ์์ ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ ๋ ์์ฃผ ์์ง๋ ์ ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ฌด ๊ณต๊ฒฉ์ ์ธ ์์ง์ CPU ์ฌ์ฉ๋์ ์ฆ๊ฐ์ํฌ ์ ์์ผ๋ฏ๋ก ํ๋กํ์ผ๋ง์ด ์ค์ํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ํํธ์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค๋ฉด ํน์ Wasm GC ๊ตฌํ์ ๋ํ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
6. ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋ฐ ๋ถ์ ๋๊ตฌ
ํจ๊ณผ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋ฐ ๋ถ์ ๋๊ตฌ๋ ์ฐธ์กฐ ์ํ์ ์๋ณํ๊ณ ๋๋ฒ๊น ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ถ์ ํ๊ณ , ์์ง๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ฉฐ, ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ์๊ฐํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ํ๊น๊ฒ๋ WebAssembly GC์ฉ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ์ ๊ฐ์ฉ์ฑ์ ์์ง ์ ํ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ Wasm ์ํ๊ณ๊ฐ ์ฑ์ํจ์ ๋ฐ๋ผ ๋ ๋ง์ ๋๊ตฌ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๊ฒ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋๊ตฌ๋ฅผ ์ฐพ์๋ณด์ญ์์ค:
- ํ ์ค๋ ์ท: ํ์ ์ค๋ ์ท์ ์บก์ฒํ์ฌ ๊ฐ์ฒด ๋ถํฌ๋ฅผ ๋ถ์ํ๊ณ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํฉ๋๋ค.
- ๊ฐ์ฒด ๊ทธ๋ํ ์๊ฐํ: ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ์๊ฐํํ์ฌ ์ฐธ์กฐ ์ํ์ ์๋ณํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ถ์ : ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์ถ์ ํ์ฌ ํจํด๊ณผ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํฉ๋๋ค.
- ๋๋ฒ๊ฑฐ์์ ํตํฉ: ๋๋ฒ๊ฑฐ์ ํตํฉํ์ฌ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๊ณ ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฒ์ฌํฉ๋๋ค.
์ ์ฉ Wasm GC ํ๋กํ์ผ๋ง ๋๊ตฌ๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ธฐ์กด ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Chrome DevTools ๋ฉ๋ชจ๋ฆฌ ํจ๋์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ถ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
7. ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ํ ์คํธ
์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ์ ์ฒ ์ ํ ํ ์คํธ๋ ์ฐธ์กฐ ์ํ์ ์๋ฐฉํ๊ณ ๊ฐ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ฝ๋ ๋ฆฌ๋ทฐ๋ ์ํ ์ฐธ์กฐ์ ์ ์ฌ์ ์์ธ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ, ํ ์คํธ๋ ๊ฐ๋ฐ ์ค์๋ ๋ช ํํ์ง ์์ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ค์ ํ ์คํธ ์ ๋ต์ ๊ณ ๋ คํ์ญ์์ค:
- ๋จ์ ํ ์คํธ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ํ์ง ์๋์ง ํ์ธํ๊ธฐ ์ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ํตํฉ ํ ์คํธ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ํธ ์์ฉํ๊ณ ์ฐธ์กฐ ์ํ์ ์์ฑํ์ง ์๋์ง ํ์ธํ๊ธฐ ์ํ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ถํ ํ ์คํธ: ์ค์ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ๊ณผ๋ถํ ์ํ์์๋ง ๋ฐ์ํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ๊ธฐ ์ํด ๋ถํ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ง ๋๊ตฌ: ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋์ผ๋ก ์๋ณํฉ๋๋ค.
WebAssembly GC ์ฐธ์กฐ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์์ฝํ์๋ฉด, WebAssembly GC ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐธ์กฐ ์ํ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ฐฉ ์ฐ์ : ์ ์ด์ ์ฐธ์กฐ ์ํ์ ์์ฑํ์ง ์๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฝ๋๋ฅผ ์ค๊ณํฉ๋๋ค.
- ์ฝํ ์ฐธ์กฐ ํ์ฉ: ์ง์ ์ ์ธ ์ฐธ์กฐ๊ฐ ํ์ํ์ง ์์ ๋ ์ํ์ ๋๊ธฐ ์ํด ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Finalization Registry ์ ์คํ๊ฒ ์ฌ์ฉ: ํ์์ ์ธ ์ ๋ฆฌ ์์ ์ Finalization Registry๋ฅผ ์ฌ์ฉํ๋, ์ํ์ ๋๋ ์ฃผ์ ์๋จ์ผ๋ก ์์กดํ์ง ์์ต๋๋ค.
- ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๊ทน๋์ ์ฃผ์: ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์์กดํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์ ์คํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ํํธ ํ์ฉ: GC์ ๋์์ ์ํฅ์ ์ฃผ๊ธฐ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ์ ํํธ๋ฅผ ํ์ํ๊ณ ํ์ฉํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ์ ํฌ์: ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ์ํ์ ์๋ณํ๊ณ ๋๋ฒ๊น ํฉ๋๋ค.
- ์๊ฒฉํ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ํ ์คํธ ๊ตฌํ: ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ฐฉํ๊ณ ๊ฐ์งํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ์ ์ฒ ์ ํ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
๊ฒฐ๋ก
์ฐธ์กฐ ์ํ ์ฒ๋ฆฌ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ WebAssembly GC ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ์ฐธ์กฐ ์ํ์ ๋ณธ์ง์ ์ดํดํ๊ณ ์ด ๊ธ์์ ์ค๋ช ํ ์ ๋ต์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ฉฐ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ๊ธฐ์ ์ธ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. WebAssembly ์ํ๊ณ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ GC ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋๊ตฌ์ ์ถ๊ฐ์ ์ธ ๋ฐ์ ์ ๊ธฐ๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋์ฑ ์ฝ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ ๋๋ค. ํต์ฌ์ ์ต์ ์ ๋ณด๋ฅผ ์ ์งํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฑํํ์ฌ WebAssembly GC์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ๊ฒ์ ๋๋ค.